Оценка физической активности

Согласно описанию, мы можем предположить, что следующие переменные могут быть косвенно связаны с уровнем физической активности:

Характеристики когорты по параметрам физической активности:

Characteristic N = 916
Weight.gain.diet
    1 5 (0.5%)
    2 911 (99%)
High.protein.diet
    1 4 (0.4%)
    2 912 (100%)
Vigorous.work
    1 176 (19%)
    2 740 (81%)
Vigorous.work.days
    0 740 (81%)
    1 19 (2.1%)
    2 22 (2.4%)
    3 24 (2.6%)
    4 17 (1.9%)
    5 60 (6.6%)
    6 13 (1.4%)
    7 21 (2.3%)
Vigorous.work.min
    Mean (SD) 32 (89)
    Median (25%-75%) 0 (0-0)
    Minimum-Maximum 0-660
Walk.bicycle
    1 211 (23%)
    2 705 (77%)
Walk.bicycle.days
    0 705 (77%)
    1 12 (1.3%)
    2 21 (2.3%)
    3 29 (3.2%)
    4 17 (1.9%)
    5 59 (6.4%)
    6 8 (0.9%)
    7 65 (7.1%)
Walk.bicycle.min
    Mean (SD) 13 (39)
    Median (25%-75%) 0 (0-0)
    Minimum-Maximum 0-480
Vigorous.recr
    1 191 (21%)
    2 725 (79%)
Vigorous.recr.days
    0 725 (79%)
    1 22 (2.4%)
    2 41 (4.5%)
    3 46 (5.0%)
    4 29 (3.2%)
    5 29 (3.2%)
    6 14 (1.5%)
    7 10 (1.1%)
Vigorous.recr.min
    Mean (SD) 16 (39)
    Median (25%-75%) 0 (0-0)
    Minimum-Maximum 0-360

В качестве параметра физической активности я собираюсь использовать сумму пяти количественных переменных: Vigorous.work.min, Walk.bicycle.min, Vigorous.recr.min, Moderate.work.act, Moderate.recr.act. Эта сумма, теоретически должна отражать количество минут физической активности проведенных во время работы, перемещений по городу, а так же досуга. Главная проблема такой оценки состоит в большой субъективности подобных оценок, некоторые люди могут иметь тенденцию завышать эти оценки. Можно попробовать также использовать комбинацию бинарных флагов для этих же занятий как ординальную переменную, однако в таком случае мы сталкиваемся с проблемой невозможности оценки равноценности вклада каждого из факторов между собой и между субъектами.

Могу предположить, что показатель гликированного гемоглобина может быть ассоццирован с тремя основными факторами: 1. Количество потребляемых углеводов, то есть качество и тип пищевого поведения;
2. Скорость метаболизма глюкозы в печени и других органах, скорость конвертации в другие молекулы (жирные кислоты, аминокислоты, гликоген);
3. Потребление глюкозы мышцами.

Эти три фактора так или иначе должны объединять в себе все остальные, приведенные на графе. Характеристики когорты по новым параметрам физической активности:

## Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
## ℹ Please use `all_of()` or `any_of()` instead.
##   # Was:
##   data %>% select(columns)
## 
##   # Now:
##   data %>% select(all_of(columns))
## 
## See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Characteristic N = 913
Physical.act.min
    Mean (SD) 133 (176)
    Median (25%-75%) 60 (0-180)
    Minimum-Maximum 0-960
Physical.act.ord
    0 231 (25%)
    1 306 (34%)
    2 224 (25%)
    3 100 (11%)
    4 42 (4.6%)
    5 10 (1.1%)

Профиль физической активности у субъектов когорты:

Зависимость уровня гликированного гемоглобина от уровня физической активности:

Можно заметить обратную нелинейную зависимость (не каузальную) уровня гликированного гемоглобина от физической активности, пациенты с высоким (более 300 минут) имеют больший разброс уровняли гликированного гемоглобина. Исходя из этого, можно разделить пациентов на следующией группы: Zero: 0 минут физической активности, Average: нижние 75% пациентов по физической активности, у которых она выше нуля; High: верхние 25% пациентов по физической активности, у которых она выше нуля.

Чтобы линеаризовать зависимость и сдвинуть распределение к более нормальному проведем логарифмическую трансформацию:

data %>% 
  rename(Glycohemoglobin = LBXGH) %>% 
  ggplot() +
  geom_density(aes(x=log(Glycohemoglobin)), fill="lightblue", color="black") +
  theme_minimal()

data_prepared %>% 
  select(
    c("Physical.act.min", "BMI", 
    "Sex", "Age.Years", "Race", "Education",
    "Marital.Status", "Family.Income", "Total.Sugars", 
    "Total.fat", "Cholesterol", "Glycohemoglobin",
    "Smoking.Status", "Alcohol.Consumption", 
    "Asthma", "Thyroid.Disease", 
    "COPD", "Low.Salt", "Energy", "Malignancy.Status")
  ) %>% 
  ggpairs( 
  upper = list(continuous = wrap("points", alpha = 0.5, size = 1),
               combo = wrap("points", alpha = 0.5, size = 1),
               disrete = "blank"),
  lower = list(continuous = "cor",
               discrete = "count",
               combo = wrap("box_no_facet", outlier.size = 0.5)),
  diag = list(continuous = "barDiag",
              discrete = "barDiag"),
  showStrips = TRUE, progress = FALSE) +
  theme_bw(base_size = 7) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        panel.grid.minor = element_blank(),
        strip.placement = "outside",
        strip.background = element_rect(color = "white", fill = "#EFEBE9"),
        strip.text = element_text(size = 7, face = "bold"))

Проверим некоторые наблюдени

ggplot(data = data_prepared, aes(x = BMI, y = Physical.act.min)) +
  geom_point(size = 2, shape = 19, color = "black", alpha = 0.75) +
  theme_bw()

Эти выбросы выглядят странно, хотя человек вполне может столько весить:

max(data_prepared$BMI) * (1.75 ** 2)
## [1] 237.3438

~ 600 грамм чистого алкоголя - выше смертельной дозы для здорового человека, однако я не знаю период и характеристик участника исследования.

ggplot(data = data_prepared, aes(x = Alcohol.Consumption, y = Physical.act.min)) +
  geom_point(size = 2, shape = 19, color = "black", alpha = 0.75) +
  theme_bw()

Выброс по энергии тоже возможно не аномальный, вполне соответствуется с потреблением сахаров:

ggplot(data = data_prepared, aes(x = Energy, y = Total.Sugars)) +
  geom_point(size = 2, shape = 19, color = "black", alpha = 0.75) +
  theme_bw()

Параметры из графа:

Race - конфаундер
Education - конфаундер
Family income - конфаундер
Smoking - прокси-конфаундер
Age - конфаундер
Comorbidities - конфаундер
Sex - конфаундер
Blood pressure - коллайдер
Diabetic medication - коллайдер
Marital status - instrumental variable

Гипотеза: физическая активность (в часах) отрицательно ассоциирована с уровнем гликированного гемоглобина.Для того, чтобы протестировать эту гипотезу и получить оценки несмещеннного эффекта физической активности на уровень гликированного гемоглобина в модель будут включены все конфаундеры. Помимо включенных в граф факторов, я также считаю необходимым внести в модель фактор, отражающий потребление углеводов и алкоголя.

Из коморбидностей я не буду включать в граф помимо повышенного давления коронарную болезнь сердца, инфаркт и инсульт, так как это тоже коллайдеры.

Регрессионный анализ

Построим полную модель со всеми ковариатами:

## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `across(where(is.numeric), round, 5)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
## 
##   # Previously
##   across(a:b, mean, na.rm = TRUE)
## 
##   # Now
##   across(a:b, \(x) mean(x, na.rm = TRUE))
term estimate std.error statistic p.value
(Intercept) 4.17597 0.24518 17.03209 0.00000
Physical.act.hrs 0.02434 0.01186 2.05253 0.04041
SexMale 0.08474 0.07648 1.10810 0.26812
Age.Years 0.01611 0.00239 6.73767 0.00000
RaceBlack -0.08698 0.14066 -0.61837 0.53649
RaceHispanic -0.26684 0.14285 -1.86792 0.06211
RaceOther -0.58242 0.23346 -2.49469 0.01279
RaceWhite -0.46237 0.12567 -3.67918 0.00025
Education.L -0.24715 0.11379 -2.17207 0.03012
Education.Q 0.10735 0.09548 1.12441 0.26115
Education.C -0.02073 0.08267 -0.25076 0.80206
Education^4 -0.07032 0.07364 -0.95484 0.33992
BMI 0.03143 0.00500 6.28291 0.00000
Alcohol.Consumption -0.00129 0.00116 -1.10542 0.26928
Low.SaltYes 0.21104 0.21890 0.96410 0.33526
Energy 0.00008 0.00005 1.67279 0.09473
Family.Income.L -0.07781 0.15606 -0.49858 0.61820
Family.Income.Q -0.02643 0.13803 -0.19148 0.84819
Family.Income.C 0.05043 0.13595 0.37097 0.71075
Family.Income^4 -0.24905 0.13230 -1.88248 0.06010
Family.Income^5 0.23695 0.13361 1.77348 0.07650
Family.Income^6 0.10197 0.13027 0.78274 0.43399
Family.Income^7 0.22165 0.12679 1.74809 0.08080
Family.Income^8 -0.02875 0.12320 -0.23337 0.81553
Family.Income^9 -0.08467 0.11990 -0.70612 0.48030
Family.Income^10 -0.12943 0.11580 -1.11773 0.26399
Family.Income^11 0.13342 0.10560 1.26340 0.20678
Total.Sugars -0.00118 0.00059 -1.99940 0.04587
Smoking.StatusFormer.Smoker 0.04058 0.07769 0.52230 0.60160
Smoking.StatusFrequent.Smoker 0.15837 0.10424 1.51937 0.12903
Smoking.StatusRare.Smoker 0.05699 0.18532 0.30751 0.75853
AsthmaYes 0.04129 0.11444 0.36080 0.71833
Thyroid.DiseaseYes 0.15676 0.11136 1.40767 0.15958
COPDYes -0.09853 0.16891 -0.58330 0.55984
Malignancy.StatusYes 0.13649 0.10942 1.24746 0.21256

Мы можем увидеть, что согласно нашей модели, физическая активность статистически значима связана с уровнег гликированного гемоглобина, при этом мы наблюдаем положительную связь, что противоречит первоначальной гипотезе, в которой мы предполагали, что связь должна быть отрицательной. При этом каждый час физической активности увеличивает уровень гликированного гемоглобина на 0.024 процентных пункта, что нормальный уровень гликированного гемоглобина примерно от 4 до 5.7%.

Проведем диагностику модели:

Модель действительно сильно подвержена гетерскедастичности, что видно по расширяющемуся “облаку” остатков:

При этом сильных выбросов в модели нет:

По ассоциациям с предикторами есть некоторые выбросы, но они сильно не влияют на полученную модель:

Поскольку мы наблюдаем гетероскдеастичность в данных, для получения корректных интервальных оценок нам необходимо скорректировать стандартные ошибки:

Factor Estimate SE t.value p.value lwr.CI upr.CI
(Intercept) 4.17597 0.22748 18.35774 0.00000 3.72951 4.62244
Physical.act.hrs 0.02434 0.01606 1.51559 0.12998 -0.00718 0.05585
SexMale 0.08474 0.08267 1.02507 0.30561 -0.07751 0.24700
Age.Years 0.01611 0.00212 7.59687 0.00000 0.01195 0.02027
RaceBlack -0.08698 0.14666 -0.59309 0.55327 -0.37483 0.20086
RaceHispanic -0.26684 0.12684 -2.10376 0.03568 -0.51578 -0.01790
RaceOther -0.58242 0.14425 -4.03762 0.00006 -0.86553 -0.29931
RaceWhite -0.46237 0.10778 -4.28985 0.00002 -0.67392 -0.25083
Education.L -0.24715 0.12812 -1.92901 0.05405 -0.49862 0.00431
Education.Q 0.10735 0.10973 0.97834 0.32818 -0.10801 0.32272
Education.C -0.02073 0.09537 -0.21736 0.82798 -0.20790 0.16644
Education^4 -0.07032 0.07468 -0.94157 0.34667 -0.21689 0.07626
BMI 0.03143 0.00572 5.49317 0.00000 0.02020 0.04266
Alcohol.Consumption -0.00129 0.00307 -0.41940 0.67503 -0.00731 0.00474
Low.SaltYes 0.21104 0.22622 0.93290 0.35113 -0.23296 0.65505
Energy 0.00008 0.00006 1.25515 0.20976 -0.00004 0.00020
Family.Income.L -0.07781 0.14337 -0.54271 0.58747 -0.35920 0.20358
Family.Income.Q -0.02643 0.12026 -0.21978 0.82609 -0.26246 0.20960
Family.Income.C 0.05043 0.13335 0.37821 0.70537 -0.21128 0.31215
Family.Income^4 -0.24905 0.12642 -1.97013 0.04914 -0.49717 -0.00094
Family.Income^5 0.23695 0.14375 1.64838 0.09963 -0.04518 0.51908
Family.Income^6 0.10197 0.15913 0.64078 0.52183 -0.21035 0.41429
Family.Income^7 0.22165 0.13444 1.64860 0.09959 -0.04223 0.48552
Family.Income^8 -0.02875 0.13908 -0.20672 0.83628 -0.30172 0.24422
Family.Income^9 -0.08467 0.14980 -0.56520 0.57208 -0.37867 0.20934
Family.Income^10 -0.12943 0.13231 -0.97825 0.32822 -0.38912 0.13025
Family.Income^11 0.13342 0.09759 1.36707 0.17195 -0.05813 0.32497
Total.Sugars -0.00118 0.00074 -1.59170 0.11181 -0.00264 0.00028
Smoking.StatusFormer.Smoker 0.04058 0.08167 0.49689 0.61939 -0.11971 0.20087
Smoking.StatusFrequent.Smoker 0.15837 0.12309 1.28659 0.19858 -0.08322 0.39996
Smoking.StatusRare.Smoker 0.05699 0.15123 0.37684 0.70639 -0.23982 0.35380
AsthmaYes 0.04129 0.12732 0.32431 0.74578 -0.20859 0.29117
Thyroid.DiseaseYes 0.15676 0.13120 1.19480 0.23249 -0.10074 0.41426
COPDYes -0.09853 0.20350 -0.48415 0.62840 -0.49794 0.30088
Malignancy.StatusYes 0.13649 0.10359 1.31759 0.18799 -0.06683 0.33981

После коррекции стандартных ошибок физическая активность теряет статистическую значимость. При этом, если даже рассматреть верхнюю границу ДИ для физической активности, то 1 час физической активности повышает уровень гликированного гемоглобина лишь на 0.056 процентных пункта, что все еще представляется клинически незначимым эффектом, а о клинической значимости нижней границы и говорить не приходится.

Если рассмотреть модель без ковариат, то можно также придти к выводу, что эффект статистически и клинически не значим:

term estimate std.error statistic p.value
(Intercept) 5.81393 0.04308 134.95081 0.00000
Physical.act.hrs -0.00425 0.01171 -0.36274 0.71688

Проведем диагностику модели:

Поскольку мы снова наблюдаем гетероскдеастичность, то скорректируем значения стандартных ошибок и получим доверительные интервалы:

Factor Estimate SE t.value p.value lwr.CI upr.CI
(Intercept) 5.81393 0.04728 122.9691 0.0000 5.72114 5.90672
Physical.act.hrs -0.00425 0.01604 -0.2647 0.7913 -0.03573 0.02724

То же мы можем заключить и после коррекции, физическая активность не оказывает статистически или клинически значимого влияния (даже если оценивать границы интервалов).

Вывод: физическая активность в данной модели не оказывает статистически и клинически значимого эффекта на уровень гликированного гемоглобина.

Явлояется ли пол модификатором эффекта физической активности?

term estimate std.error statistic p.value
(Intercept) 4.13167 0.24902 16.59178 0.00000
Physical.act.hrs 0.04492 0.02346 1.91462 0.05587
SexMale 0.13112 0.08905 1.47253 0.14124
Age.Years 0.01611 0.00239 6.73920 0.00000
RaceBlack -0.08774 0.14066 -0.62374 0.53296
RaceHispanic -0.26227 0.14292 -1.83507 0.06683
RaceOther -0.58014 0.23347 -2.48485 0.01315
RaceWhite -0.45789 0.12575 -3.64138 0.00029
Education.L -0.25072 0.11384 -2.20241 0.02790
Education.Q 0.10390 0.09554 1.08758 0.27708
Education.C -0.02048 0.08267 -0.24771 0.80442
Education^4 -0.07156 0.07365 -0.97158 0.33153
BMI 0.03162 0.00501 6.31691 0.00000
Alcohol.Consumption -0.00124 0.00117 -1.06658 0.28645
Low.SaltYes 0.21604 0.21895 0.98669 0.32407
Energy 0.00008 0.00005 1.71255 0.08715
Family.Income.L -0.07226 0.15615 -0.46272 0.64368
Family.Income.Q -0.03363 0.13821 -0.24332 0.80781
Family.Income.C 0.05859 0.13618 0.43020 0.66715
Family.Income^4 -0.25340 0.13237 -1.91437 0.05590
Family.Income^5 0.24283 0.13373 1.81583 0.06974
Family.Income^6 0.10219 0.13027 0.78449 0.43297
Family.Income^7 0.21592 0.12692 1.70131 0.08924
Family.Income^8 -0.02917 0.12320 -0.23676 0.81290
Family.Income^9 -0.09022 0.12003 -0.75167 0.45245
Family.Income^10 -0.13620 0.11599 -1.17424 0.24062
Family.Income^11 0.13165 0.10562 1.24650 0.21291
Total.Sugars -0.00116 0.00059 -1.96632 0.04958
Smoking.StatusFormer.Smoker 0.04104 0.07769 0.52825 0.59746
Smoking.StatusFrequent.Smoker 0.15893 0.10423 1.52470 0.12769
Smoking.StatusRare.Smoker 0.06297 0.18541 0.33961 0.73424
AsthmaYes 0.04829 0.11464 0.42123 0.67369
Thyroid.DiseaseYes 0.15984 0.11140 1.43486 0.15168
COPDYes -0.10615 0.16907 -0.62784 0.53027
Malignancy.StatusYes 0.12779 0.10975 1.16440 0.24458
Physical.act.hrs:SexMale -0.02749 0.02704 -1.01677 0.30955

Данные гетероскедастичны, скорректируем стандартные ошибки:

Factor Estimate SE t.value p.value lwr.CI upr.CI
(Intercept) 4.13167 0.23321 17.71654 0.00000 3.67396 4.58939
Physical.act.hrs 0.04492 0.04064 1.10539 0.26929 -0.03484 0.12469
SexMale 0.13112 0.11000 1.19199 0.23359 -0.08478 0.34703
Age.Years 0.01611 0.00213 7.55927 0.00000 0.01193 0.02030
RaceBlack -0.08774 0.14707 -0.59655 0.55096 -0.37640 0.20092
RaceHispanic -0.26227 0.12815 -2.04655 0.04100 -0.51379 -0.01075
RaceOther -0.58014 0.14659 -3.95766 0.00008 -0.86784 -0.29244
RaceWhite -0.45789 0.10915 -4.19499 0.00003 -0.67212 -0.24366
Education.L -0.25072 0.13112 -1.91220 0.05618 -0.50806 0.00662
Education.Q 0.10390 0.10948 0.94902 0.34287 -0.11098 0.31878
Education.C -0.02048 0.09588 -0.21357 0.83093 -0.20865 0.16770
Education^4 -0.07156 0.07436 -0.96234 0.33615 -0.21750 0.07438
BMI 0.03162 0.00572 5.53296 0.00000 0.02041 0.04284
Alcohol.Consumption -0.00124 0.00306 -0.40659 0.68441 -0.00725 0.00476
Low.SaltYes 0.21604 0.22780 0.94836 0.34321 -0.23107 0.66314
Energy 0.00008 0.00006 1.29353 0.19617 -0.00004 0.00021
Family.Income.L -0.07226 0.14160 -0.51027 0.60999 -0.35018 0.20567
Family.Income.Q -0.03363 0.11748 -0.28627 0.77474 -0.26420 0.19694
Family.Income.C 0.05859 0.13346 0.43899 0.66077 -0.20334 0.32052
Family.Income^4 -0.25340 0.12943 -1.95777 0.05057 -0.50744 0.00063
Family.Income^5 0.24283 0.14893 1.63056 0.10334 -0.04946 0.53513
Family.Income^6 0.10219 0.16087 0.63526 0.52542 -0.21354 0.41792
Family.Income^7 0.21592 0.13281 1.62575 0.10436 -0.04475 0.47659
Family.Income^8 -0.02917 0.13978 -0.20867 0.83475 -0.30351 0.24517
Family.Income^9 -0.09022 0.14892 -0.60582 0.54479 -0.38251 0.20207
Family.Income^10 -0.13620 0.13283 -1.02539 0.30546 -0.39690 0.12450
Family.Income^11 0.13165 0.09775 1.34678 0.17840 -0.06020 0.32351
Total.Sugars -0.00116 0.00074 -1.56548 0.11783 -0.00262 0.00029
Smoking.StatusFormer.Smoker 0.04104 0.08234 0.49846 0.61828 -0.12056 0.20265
Smoking.StatusFrequent.Smoker 0.15893 0.12274 1.29482 0.19572 -0.08197 0.39983
Smoking.StatusRare.Smoker 0.06297 0.15146 0.41572 0.67772 -0.23431 0.36024
AsthmaYes 0.04829 0.12643 0.38196 0.70258 -0.19985 0.29644
Thyroid.DiseaseYes 0.15984 0.13139 1.21650 0.22412 -0.09804 0.41772
COPDYes -0.10615 0.20610 -0.51505 0.60665 -0.51066 0.29836
Malignancy.StatusYes 0.12779 0.10778 1.18570 0.23606 -0.08374 0.33932
Physical.act.hrs:SexMale -0.02749 0.04261 -0.64519 0.51898 -0.11112 0.05614

Итак, эффект взаимодействия пола и физической активности не является статистически значимым, при прочих равных 1 час физической активности среди мужчин повышает уровень гликированного гемоглобина на 0.027 процентных пункта меньше, чем у женщин. При этом нижняя интервальная оценка этого изменения оценивает разницу в 0.11 процентных пункта, что, как мне кажется, все еще нельзя рассматривать, как клинически значимое отклонение.